<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <script>
    // js的函数作用域  

    // 在 JavaScript 中, 对象和函数同样也是变量。
    // 在 JavaScript 中, 作用域为可访问变量，对象，函数的集合。

    // 函数会产生作用域  
    // 变量分为了 全局变量和局部变量
    // 全局变量 任意的位置可以调用  存储window对象中
    // 局部变量  只能在函数内部调用   函数内部用var 声明的变量 外部无法访问局部变量

    // 3. 啥是全局作用域？
    // 		在函数外声明的变量，可以在整个页面中访问。关闭页面后，变量被释放。

    // 		变量在函数外定义，即为全局变量。
    // 		全局变量有 全局作用域: 网页中所有脚本和函数均可使用。
    // 	4. 局部变量？
    // 		局部变量：在函数内声明的变量，只能在该函数中访问。退出函数后，变量被释放。
    var x = 88; //全局变量

    // 6. js 变量的生命周期：  优化代码方案：尽少的声明全局变量
    // 			JavaScript 变量的生命期从它们被声明的时间开始。
    // 			局部变量会在函数运行以后被删除。
    // 			全局变量会在页面关闭后被删除。
    // 			函数参数只在函数内起作用，是局部变量。


    // 7. 作用域链

    // 作用域链：内部函数访问外部函数的变量，采取的是链式查找的方法来决定取那个结构，
    // 这种结构称之为作用域链

    // 作用域链的原则：就近原则

    // 只要是代码，就有一个作用域，写在函数内部的就叫做局部作用域；
    // 如果函数中还有函数，那么在这个作用域中又可以诞生一个作用域
    // 当在函数作用域中操作一个变量的时候，会先在自身作用域中查找，
    // 如果有就直接使用，如果没有就向上级作用域中寻找。如果全局作用域中也没有，那么就报错。
    function add() {
      var x = 99;//局部变量
      var k = 188;
      y = 100;//函数内部 不使用var 声明的变量 是全局变量  不建议书写4
      car();

      function car() {
        var x = 100;
        var z = 166;
        console.log(k)
        function mm() {
          console.log(x)
        }
        mm();
      }

    }

    add()
    // console.log(window)
    // console.log(window.y)

  </script>
</body>

</html>